import logging
from pathlib import Path

from fastapi import APIRouter

from app.models import POSCARRequest, POSCARResponse
from app.utils.common_utils import ProcessingError, run_pos2abr, setup_cache_directory

router = APIRouter()
logger = logging.getLogger(__name__)


async def process_pos2abr(cache_dir: Path):
    """处理POSCAR到ABR的转换"""
    try:
        run_pos2abr(cache_dir)

        # 检查并读取所有必需的输出文件
        required_files = {
            "poscar_std": (cache_dir / "POSCAR_std", "pos2aBR未能生成POSCAR_std文件"),
            "abrs": (cache_dir / "posout", "pos2aBR未能生成posout文件"),
        }

        contents = {}
        for key, (path, error_msg) in required_files.items():
            try:
                contents[key] = path.read_text()
            except FileNotFoundError:
                raise ProcessingError(error_msg) from None

        return POSCARResponse.model_validate({"status": "success", **contents})
    except ProcessingError:
        raise
    except Exception as e:
        raise ProcessingError(f"POS2ABR处理错误: {str(e)}") from e


@router.post(
    "/pos2abr",
    summary="POSCAR转换为标准POSCAR和ABR",
    description="将任意POSCAR文件转换为标准化的原胞格式，并生成原子带表示(ABR)信息",
    response_description="返回标准化的POSCAR内容和ABR列表",
    response_model=POSCARResponse,
)
async def pos2abr(request: POSCARRequest):
    """
    ## POSCAR标准化处理

    将输入的POSCAR文件转换为标准化的原胞(primitive cell)格式，并生成对应的原子带表示(ABR)。

    ### 处理流程：
    1. 使用phonopy生成标准化原胞(PPOSCAR)
    2. 调用pos2aBR程序进行拓扑分析
    3. 生成标准化POSCAR和ABR信息

    ### 输入参数：
    - **poscar_content**: POSCAR文件的完整内容（包含晶格参数、原子位置等信息）

    ### 返回结果：
    - **status**: 处理状态 ("success" 或 "error")
    - **poscar_std**: 标准化后的POSCAR文件内容
    - **abrs**: 原子带表示列表，包含原子轨道信息
    ```
    """
    cache_dir = setup_cache_directory(request.poscar_content)
    return await process_pos2abr(cache_dir)
